package orthello;

import java.util.Scanner;
import ui.OthelloUserInterface;
import ui.UIHulpMethodes;
import ui.UserInterfaceFactory;
import ui.Event;

public class Orthello {

	OthelloUserInterface ui;
	private BeurtRij beurtRij;
	private final static int MAX_AANTAL_BEURTEN = 120;
	private final static int HOOGTE = 8;
	private final static int BREEDTE= 8;
	private int huidigeBeurt;
	Orthello(){

		beurtRij = new BeurtRij(MAX_AANTAL_BEURTEN);
		ui = UserInterfaceFactory.geefOthelloUI();
		UIHulpMethodes.vraagGebruikerOmInvoer();
	}
	
	
	public int geefKleur(Beurt beurt){
	
		//in 1 regel
		if(beurt.geefWit()){
			return ui.WIT;
		} else {
			return ui.ZWART;
		}
	}
	
	public int geefInverseKleur(Beurt beurt){
		
		//in 1 regel
		if(beurt.geefWit()){
			return ui.ZWART;
		} else {
			return ui.WIT;
		}
	}
	
	public void plaatsSteen(Coordinaat coordinaat,int kleur){
		ui.plaats(coordinaat.geefX(), coordinaat.geefY(), kleur);
	}
	
	public void plaatsVeranderdeStenen(CoordinaatRij coordinaatRij,int kleur){
		for(int i = 0;i < coordinaatRij.geefAantalCoordinaten();i++){
			plaatsSteen(coordinaatRij.geefCoordinaten()[i],kleur);
		}
	}
	
	public void plaatsZet(Zet zet,int kleur){
		plaatsVeranderdeStenen(zet.geefVeranderdeStenen(),kleur);
		plaatsSteen(zet.geefZetCoordinaat(),kleur);
	}
	
	public void plaatsBeurt(Beurt beurt){
		plaatsZet(beurt.geefZetInhoud(),geefKleur(beurt));		
	}

	public void doeBeurtTerug(Beurt beurt){
		if(beurt.geefZet()){
			plaatsSteen(beurt.geefZetInhoud().geefZetCoordinaat(),ui.LEEG);
			plaatsVeranderdeStenen(beurt.geefZetInhoud().geefVeranderdeStenen(),geefInverseKleur(beurt));
		}
		ui.toon();
	}

	public void doeBeurt(Beurt beurt){
		if(beurt.geefZet()){
			plaatsBeurt(beurt);
		}
	}

	public void verwerkPijltje(Event event){
		
	}
	
	public void verwerkKlik(Event event){
		
	}
	
	public void verwerkLetter(Event event){
		if(event.data.equals("a") && huidigeBeurt < beurtRij.geefHuidigAantalBeurten()){
			doeBeurt(beurtRij.geefBeurt(huidigeBeurt));
			ui.toon();
			huidigeBeurt += 1;
		} else if (event.data.equals("s") && huidigeBeurt > 0){
			doeBeurtTerug(beurtRij.geefBeurt(huidigeBeurt - 1));
			huidigeBeurt -= 1;
		}
		
	}
	
	public void verwerkEvent(Event event){
		if(event.naam.equals("letter")){
			verwerkLetter(event);
		} else if (event.naam.equals("klik")){
			verwerkKlik(event);
		} else if (event.naam.equals("pijltje")){
			verwerkPijltje(event);
		}
		
	}

	public void wachtOpInvoer(){
		while(true){
			Event event = ui.geefEvent();
			verwerkEvent(event);
		}
	}

	public boolean leesZet(String input){
		return input.contains("zet");
	}

	public boolean leesWitOfZwart(String input){
		return input.contains("zwart");
	}

	public Coordinaat leesCoordinaat(char letter,int cijfer){
		letter -= 'a';
		return new Coordinaat(letter,cijfer -1);
	}

	public Zet leesBeurt(Scanner regel){
		Coordinaat zetCoordinaat = leesCoordinaat(regel.next().charAt(0),regel.nextInt());
		CoordinaatRij coordinaatRij = new CoordinaatRij(HOOGTE * BREEDTE);
		while(regel.hasNext()){
			coordinaatRij.voegToe(leesCoordinaat(regel.next().charAt(0),regel.nextInt()));
		}
		return new Zet(zetCoordinaat,coordinaatRij);
	}
	
	public void leesRegel(String input){
		Scanner regel = new Scanner(input);
			boolean wit = leesWitOfZwart(regel.next());
			int denkTijd = regel.nextInt();
			boolean zet = leesZet(regel.next());				
			if(zet){
				beurtRij.voegBeurtToe(new Beurt(zet,wit,denkTijd,leesBeurt(regel)));
			} else{
				beurtRij.voegBeurtToe(new Beurt(zet,wit,denkTijd));
			}
	}
	public void leesBestand(Scanner in){
		while(in.hasNext()){
			leesRegel(in.nextLine());
		}
	}

	public void initialiseerBord(){
		huidigeBeurt = 0;
		ui.plaats(3, 3, ui.ZWART);
		ui.plaats(4, 4, ui.ZWART);
		ui.plaats(3, 4, ui.WIT);
		ui.plaats(4, 3, ui.WIT);
		ui.toon();

	}

	public void start(){
		Scanner in = new Scanner(System.in);
		leesBestand(in);
		initialiseerBord();
		wachtOpInvoer();

	}
	public static void main(String[] argv) {
		new Orthello().start();
	}

}
